


package com.origin.ebuy.dao.comm;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.origin.ebuy.utils.JdbcUtils;
import com.origin.ebuy.utils.LogUtils;
import com.origin.ebuy.utils.SQLUtils;



/**
 * dao基类
 * @author origin
 */
public class BaseDao {
	
	
	/**
	 * 查询数据
	 * @param table
	 * @param cols
	 * @param where
	 * @param parames
	 * @param handler
	 * @return
	 * @throws SQLException
	 */
	protected Object query(String table,String[] cols,String where,Object[] parames,ResultHandler handler) throws SQLException{
		List<Object> list = null;
		if(parames==null){
			list = new ArrayList<Object>(0);
		}else{
			list = Arrays.asList(parames);
		}
		return query(table, cols, where, list, handler);
	}	
	
	/**
	 * 查询数据
	 * @param table
	 * @param cols
	 * @param where
	 * @param parames
	 * @param handler
	 * @return
	 * @throws SQLException
	 */
	protected Object query(String table,String[] cols,String where,List<Object> parames,ResultHandler handler) throws SQLException{
		String sql = SQLUtils.getQuerySQL(table, cols, where);
		LogUtils.log(sql);
		Connection con = null;
		PreparedStatement stat = null; 
		ResultSet rest = null;
		try{
			con  = JdbcUtils.getConnection();
			stat = con.prepareStatement(sql);
			//参数不等于null时候进行设置
			if(parames != null){
				for (int i =0;i<parames.size();i++) {
					stat.setObject(i+1,parames.get(i));
				}
			}
			rest = stat.executeQuery();
			//解析数据,回到UserDao解析
			return handler.handler(rest);
		}finally{
			JdbcUtils.close(rest, stat, con);
		}
	}
	
	
	
	/**
	 * 删除数据
	 * @param table 表名称
	 * @param where 条件
	 * @param parames 参数
	 * @return
	 * @throws SQLException
	 */
	protected int delete(String table,String where,List<Object> parames) throws SQLException{
		//delete from orders where id=?
		String sql = "delete from "+table+" where "+where;
		return update(sql, parames);
	}
	
	/**
	 * 更新数据
	 * @param table 表名称
	 * @param cols 列名称
	 * @param where 更新条件
	 * @param parames 参数
	 * @return
	 * @throws SQLException
	 */
	protected int update(String table,String[] cols,String where,Object[] parames) throws SQLException{
		String sql = SQLUtils.getUpdateSQL(table, cols, where);
		return update(sql, Arrays.asList(parames));
	}
	
	/**
	 * 插入数据
	 * @param table 表名称
	 * @param cols 列名称
	 * @param where 条件 
	 * @param parames 参数
	 * @return
	 * @throws SQLException 
	 */
	protected int insert(String table,String[] cols,Object[] parames) throws SQLException{
		String sql = SQLUtils.getInsertSQL(table, cols);
		return update(sql, Arrays.asList(parames));
	}
	
	/**
	 * 更新数据
	 * @param sql 执行的sql语句
	 * @param parames 参数
	 * @return 返回操作的状态
	 * @throws SQLException
	 */
	public int update(String sql,List<Object> parames) throws SQLException{
		LogUtils.log(sql);
		Connection con = null;
		PreparedStatement stat = null; 
		try{
			//获取连接
			con = JdbcUtils.getConnection();
			//预处理
			stat = con.prepareStatement(sql);
			//设置参数
			if(parames != null){
				for (int i=0;i<parames.size();i++) {
					stat.setObject(i+1,parames.get(i));
				}
			}
			return stat.executeUpdate();
		}finally{
			JdbcUtils.close(null, stat, con);
		}
	}
	
}
